﻿using System;
using System.Net.Http;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;

namespace TCPClientConsole
{
	class Program
	{
		static NetworkStream stream;
		static string PublicIP = "";
		static void Main(string[] args)
		{
			Connect("174.120.9.60", "Hi, Server");
		}

		static void Connect(String server, String message)
		{
			try
			{
				// Create a TcpClient.
				// Note, for this client to work you need to have a TcpServer 
				// connected to the same address as specified by the server, port
				// combination.
				Int32 port = 9001;
				TcpClient client = new TcpClient(server, port);

				// Translate the passed message into ASCII and store it as a Byte array.
				Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);

				// Get a client stream for reading and writing.
				//  Stream stream = client.GetStream();

				stream = client.GetStream();

				// Send the message to the connected TcpServer. 
				stream.Write(data, 0, data.Length);

				Console.WriteLine("Sent: {0}", message);

				// Receive the TcpServer.response.

				// Buffer to store the response bytes.
				data = new Byte[256];

				// String to store the response ASCII representation.
				String responseData = String.Empty;

				// Read the first batch of the TcpServer response bytes.
				Int32 bytes = stream.Read(data, 0, data.Length);
				responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
				Console.WriteLine("Received: {0}", responseData);

				while (true)
				{
					Thread.Sleep(1000);
					try
					{
						bytes = stream.Read(data, 0, data.Length);
						responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
						if (responseData == "publicip")
						{
							ShowPublicIP();
						}
						Console.WriteLine("Received: {0}", responseData);
					}
					catch { }
				}

				// Close everything.
				stream.Close();
				client.Close();
			}
			catch (ArgumentNullException e)
			{
				Console.WriteLine("ArgumentNullException: {0}", e);
			}
			catch (SocketException e)
			{
				Console.WriteLine("SocketException: {0}", e);
			}

			Console.WriteLine("\n Press Enter to continue...");
			Console.Read();
		}

		static void ShowPublicIP()
		{
			if (stream != null)
			{
				Byte[] data = GetIPAddressData();
				stream.Write(data, 0, data.Length);
			}
			GetPublicIp();
		}

		static Byte[] GetIPAddressData()
		{
			Byte[] data = System.Text.Encoding.ASCII.GetBytes(PublicIP);
			return data;
		}

		static string GetPublicIp()
		{
			HttpClient client = new HttpClient();
			Task<string> task = client.GetStringAsync("http://checkip.dyndns.org");
			task.ContinueWith(TaskEnded);
			return PublicIP;
		}

		static void TaskEnded(Task<string> task)
		{
			string[] a = task.Result.Split(':');
			string a2 = a[1].Substring(1);
			string[] a3 = a2.Split('<');
			PublicIP = a3[0];
		}
	}
}
